home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_081 / CBHD501 / SRC / M2 / SCSIIO.M < prev    next >
Text File  |  1998-03-14  |  10KB  |  351 lines

  1. IMPLEMENTATION MODULE ScsiIO;
  2. (****************************************************************************
  3.  *
  4.  * Scsi-Input/Output auf midlevel-Ebene
  5.  *
  6.  * (c) 1990-1992 Helge Schulz
  7.  * (c) 1990-1993 Steffen Engel
  8.  *
  9.  * $Source: E:\HM2\LIB\se\rcs\scsiio.m,v $
  10.  *
  11.  * $Revision: 1.10 $
  12.  *
  13.  * $Author: S_Engel $
  14.  *
  15.  * $Date: 1996/02/03 19:34:10 $
  16.  *
  17.  * $State: Exp $
  18.  *
  19.  *****************************************************************************
  20.  * History:
  21.  *
  22.  * $Log: scsiio.m,v $
  23.  * Revision 1.10  1996/02/03  19:34:10  S_Engel
  24.  * Kleine Anpassungen
  25.  *
  26.  * Revision 1.9  1995/10/30  17:44:48  S_Engel
  27.  * *** empty log message ***
  28.  *
  29.  * Revision 1.8  1995/05/11  15:24:38  S_Engel
  30.  * virtuelles RAM: Daten werden kopiert.
  31.  *
  32.  * Revision 1.7  1995/04/04  15:10:14  S_Engel
  33.  * Grundsätzlich Verwendung externer SCSI-Routinen
  34.  *
  35.  * Revision 1.6  1995/03/08  03:19:44  S_Engel
  36.  * InquireDev und InquireSCSI korrekt mit langem Ergebnis
  37.  *
  38.  * Revision 1.5  1995/02/25  23:23:34  S_Engel
  39.  * BugFix: InquireSCSI verwendete Adresse der Pufferadreßvariablen.
  40.  *
  41.  * Revision 1.4  1995/02/10  14:02:02  S_Engel
  42.  * In und Out als Prozedurvariablen, damit man sich davor
  43.  * einklinken kann.
  44.  *
  45.  * Revision 1.3  1995/02/10  12:38:46  S_Engel
  46.  * Anpassungen an aktuellen SCSI-Treiber
  47.  *
  48.  * Revision 1.2  1995/02/07  23:59:48  S_Engel
  49.  * Umstellung auf handleorientierte SCSI-Routinen
  50.  *
  51.  * Revision 1.1  1995/01/01  19:14:54  S_Engel
  52.  * Initial revision
  53.  *
  54.  *
  55.  *  30.09.93 Kompatibilität mit virtuellem RAM fertiggestellt
  56.  *  08.09.93 Endgültige Umstellung auf den Betrieb mit FRB. ScsiIO geht autark mit dem FRB um, und sollte auch mit virtuellem RAM klarkommen.
  57.  *  10.01.93 Falcon-Routinen eingebaut (SE)
  58.  *  15.10.92 BHDI für den Gebrauch mit Alien eingebaut (SE)
  59.  *  08.10.92 Fehlermeldung OnlyTT eingebaut (Cookie-Check) (SE)
  60.  *  05.10.92 Cache-Clear installiert, TT anscheinend jetzt stabil
  61.  *  29.04.92 TT-Unterstützung installiert (SE)
  62.  *  13.04.92 SetScsiAdr setzt LastCmd auf 0
  63.  *  30.12.91 MaxScsiAdr auf 7 erhöht für modifizierte Adapter
  64.  *  21.07.91 Auszeitprozedurvariablen
  65.  *  19.07.91 Anpassung an Compiler-Version 4.1
  66.  *  30.11.90 Aufteilung von StopDiscMotor in Break- und StopDisc
  67.  *  28.11.90 Konstante DevDiscTimeout und DiscWaitTime
  68.  *  02.10.90 Prozedur StopDiscMotor
  69.  *
  70.  *****************************************************************************)
  71.  
  72.  
  73.  (*$S- $V- $T- *)
  74.  
  75. (* Systemabhängiges *)
  76. (* IMPLEMENTATION FÜR  >>> Hänisch-Modula-2 <<< *)
  77. (*                                              *)
  78. (* Durchgeführt von Steffen Engel               *)
  79. (*                                              *)
  80. (*$S-   Stack-Checks                            *)
  81. (*$I-   keine Variablen-Initialisierung         *)
  82. (*$V-   keine arithmetischen Kontrollen         *)
  83. (*$T-   kein Bereichstest                       *)
  84. (*$Y-   keine Laufzeittests auf RETURN und CASE *)
  85. (*                                              *)
  86. (*----------------------------------------------*)
  87.  
  88. (*$R2+ D2/A2 sichern        *)
  89. (*$K+  Aufrufer räumt Stack *)
  90.  
  91.  
  92.  
  93. IMPORT SYSTEM, System;
  94.  
  95. (* Standard HM2-Libs *)
  96. FROM SYSTEM IMPORT ADR, BYTE, ADDRESS, WORD, CAST, TSIZE, LOAD, STORE, CODE;
  97. IMPORT Cookie, Block, void;
  98. IMPORT Str;
  99.  
  100. (* Magic-Lib *)
  101. IMPORT MagicDOS;
  102.  
  103. (* Eigene Libs *)
  104. IMPORT Err;
  105.  
  106. (* Projektlibs *)
  107. IMPORT ScsiDefs;
  108.  
  109.  
  110.   (* String für WHAT - leider ein bißchen HM2-spezifisches *)
  111.   CONST What = '@(#) ScsiIO, compiled '
  112.                + CHR(SYSTEM.DATE DIV 1000000H DIV 10 + 48)
  113.                + CHR(SYSTEM.DATE DIV 1000000H MOD 10 + 48) + '.'
  114.                + CHR(SYSTEM.DATE DIV 10000H MOD 100H DIV 10 MOD 10 + 48)
  115.                + CHR(SYSTEM.DATE DIV 10000H MOD 100H MOD 10 + 48) + '.'
  116.                + CHR(SYSTEM.DATE MOD 10000H DIV 10 MOD 10 + 48)
  117.                + CHR(SYSTEM.DATE MOD 10000H MOD 10 + 48)
  118.                + '  (c) S. Engel';
  119.  
  120. CONST ForeignXFRB = FALSE;      (* Soll ein globaler FRB benutzt werden, falls vorhanden? *)
  121.  
  122.    (*------ Deklarationsteil *)
  123.  
  124.  
  125. (* Alles für den XFRB *)
  126.  
  127. TYPE  tXFRB = RECORD
  128.                 version : SHORTINT;            (* Version des XFRB-cookies, $0101 = 1.00 *)
  129.                 xflock  : POINTER TO SHORTINT;  (* extended flock, Semaphore *)
  130.                 buffer  : ADDRESS;             (* Adresse eines Puffers im ST-RAM, mindestens 64 KByte *)
  131.                 size    : LONGINT;             (* Puffergröße *)
  132.                 next    : POINTER TO tXFRB;    (* Zeiger auf weitere Struktur *)
  133.               END;
  134. VAR   XFRB            : POINTER TO tXFRB;
  135.       HasVirtualRAM   : BOOLEAN;
  136.  
  137.  
  138.  
  139. PROCEDURE MyIn(Parms : ScsiDefs.tpSCSICmd): LONGINT;
  140. VAR dest        : SYSTEM.ADDRESS;
  141.     len         : LONGCARD;
  142.     phystop[042EH] : LONGCARD;
  143.  
  144.   BEGIN
  145.     IF ScsiActive
  146.       THEN
  147.         IF HasVirtualRAM
  148.           THEN
  149.             dest := Parms^.Buffer;
  150.             len := Parms^.TransferLen;
  151.             IF dest > phystop
  152.               THEN
  153.                 Parms^.Buffer := XFRB^.buffer;
  154.               END;
  155.           END;
  156.  
  157.         ScsiErrorCode := ScsiCall^.In(Parms);
  158.  
  159.         IF HasVirtualRAM
  160.           THEN
  161.             IF dest > phystop
  162.               THEN
  163.                 Block.Move(XFRB^.buffer, dest, len);
  164.               END;
  165.           END;
  166.       ELSE
  167.         ScsiErrorCode := MIN(SHORTINT);
  168.       END;
  169.     RETURN ScsiErrorCode;
  170.  
  171.   END MyIn;
  172.  
  173. PROCEDURE MyOut(Parms : ScsiDefs.tpSCSICmd): LONGINT;
  174. VAR phystop[042EH] : LONGCARD;
  175.  
  176.   BEGIN
  177.     IF ScsiActive
  178.       THEN
  179.         IF HasVirtualRAM AND (Parms^.Buffer > phystop)
  180.           THEN
  181.             Block.Move(Parms^.Buffer, XFRB^.buffer, Parms^.TransferLen);
  182.             Parms^.Buffer := XFRB^.buffer;
  183.           END;
  184.         ScsiErrorCode := ScsiCall^.Out(Parms);
  185.       ELSE
  186.         ScsiErrorCode := MIN(SHORTINT);
  187.       END;
  188.     RETURN ScsiErrorCode;
  189.   END MyOut;
  190.  
  191. PROCEDURE InquireSCSI(    what : SHORTINT;
  192.                       VAR Info : ScsiDefs.tBusInfo) : LONGINT;
  193.  
  194.   BEGIN
  195.     IF ScsiActive
  196.       THEN
  197.         RETURN ScsiCall^.InquireSCSI(what, Info);
  198.       ELSE
  199.         RETURN MIN(LONGINT);
  200.       END;
  201.  
  202.   END InquireSCSI;
  203.  
  204. PROCEDURE InquireBus (    what     : SHORTINT;
  205.                           BusNo    : SHORTINT;
  206.                       VAR Dev      : ScsiDefs.tDevInfo) : LONGINT;
  207.  
  208.   BEGIN
  209.     IF ScsiActive
  210.       THEN
  211.         RETURN ScsiCall^.InquireBus(what, BusNo, Dev);
  212.       ELSE
  213.         RETURN MIN(SHORTINT);
  214.       END;
  215.  
  216.   END InquireBus;
  217.  
  218. PROCEDURE CheckDev(     BusNo : SHORTINT;
  219.                     VAR (*$RO*) DevNo : ScsiDefs.DLONG;
  220.                     VAR Name : STRING;
  221.                     VAR Features : BITSET): LONGINT;
  222.  
  223.   BEGIN
  224.     IF ScsiActive
  225.       THEN
  226.         RETURN ScsiCall^.CheckDev(BusNo, DevNo, Name, Features);
  227.       ELSE
  228.         RETURN MIN(SHORTINT);
  229.       END;
  230.   END CheckDev;
  231.  
  232. PROCEDURE RescanBus(BusNo : SHORTINT) : LONGINT;
  233.  
  234.   BEGIN
  235.     IF ScsiActive
  236.       THEN
  237.         RETURN ScsiCall^.RescanBus(BusNo);
  238.       ELSE
  239.         RETURN MIN(SHORTINT);
  240.       END;
  241.   END RescanBus;
  242.  
  243. PROCEDURE Open(     Bus : SHORTINT;
  244.                 VAR (*$RO*) Id : ScsiDefs.DLONG;
  245.                 VAR MaxLen : LONGCARD) : LONGINT;
  246. VAR count : SHORTCARD;
  247.  
  248.   BEGIN
  249.     IF ScsiActive
  250.       THEN
  251.         RETURN ScsiCall^.Open(Bus, Id, MaxLen);
  252.       ELSE
  253.         RETURN MIN(LONGINT);
  254.       END;
  255.  
  256.   END Open;
  257.  
  258. PROCEDURE Close(handle : ScsiDefs.tHandle) : LONGINT;
  259. VAR ret : LONGINT;
  260.   BEGIN
  261.     IF ScsiActive
  262.       THEN
  263.         RETURN ScsiCall^.Close(handle);
  264.       ELSE
  265.         RETURN MIN(LONGINT);
  266.       END;
  267.  
  268.   END Close;
  269.  
  270. PROCEDURE Error(handle : ScsiDefs.tHandle; rwflag, error : SHORTINT) : LONGINT;
  271. VAR ret : LONGINT;
  272.  
  273.   BEGIN
  274.     IF ScsiActive
  275.       THEN
  276.         RETURN ScsiCall^.Error(handle, rwflag, error);
  277.       ELSE
  278.         RETURN MIN(LONGINT);
  279.       END;
  280.  
  281.   END Error;
  282.  
  283. PROCEDURE CheckVirtual;
  284. VAR CkVal : LONGINT;
  285.  
  286.   BEGIN
  287.     HasVirtualRAM := Cookie.Get(LONGCARD('PMMU'), CkVal)
  288.                       AND (CkVal # 0);
  289.  
  290.     IF HasVirtualRAM AND (XFRB = NIL)
  291.       THEN
  292.         (* Dann müssen wir wohl einen anlegen *)
  293.         XFRB := MagicDOS.Mxalloc(64*1024+SIZE(XFRB^)+2, MagicDOS.STRAM);
  294.         IF XFRB = NIL
  295.           THEN
  296.             HALT;   (* Tja, Keine Chance! *)
  297.           ELSE
  298.             WITH XFRB^ DO
  299.               version := 0101H;
  300.               size := 64*1024;
  301.               xflock := XFRB + ADDRESS(SIZE(XFRB^));  (* hinter dem Cookie im ST-RAM *)
  302.               xflock^ := 0;
  303.               buffer := XFRB + ADDRESS(SIZE(XFRB^) + 2);
  304.             END;
  305.           END;
  306.       END;
  307.  
  308.   END CheckVirtual;
  309.  
  310. PROCEDURE Init;
  311.  
  312.   VAR CkVal : LONGINT;
  313.       count : SHORTINT;
  314.  
  315.   BEGIN
  316.  
  317.     ScsiActive  := FALSE;
  318.  
  319.     (* haben wir einen SCSI-Treiber mit brauchbarer Version im System? *)
  320.     IF ~Cookie.Get(LONGCARD('SCSI'), ScsiCall)
  321.        OR (ScsiCall = NIL)
  322.   (* vorerst genau prüfen *)
  323.     (*$?ScsiDefs.ScsiCallVersion # 00100H: anpassen! *)
  324.         OR (ScsiCall^.Version DIV 0100H # ScsiDefs.ScsiCallVersion DIV 0100H)
  325.       THEN
  326.         ScsiCall := NIL; (* Sicherheitshalber *)
  327.       ELSE
  328.         ScsiActive := TRUE;
  329.       END;
  330.  
  331. (*$?ForeignXFRB:
  332.     IF XFRB = NIL
  333.       THEN
  334.         (* Versuchen wir's *)
  335.         VOID(Cookie.Get(LONGCARD('XFRB'), XFRB));
  336.       END;
  337.  *)
  338.  
  339.   CheckVirtual;
  340.  
  341.   
  342.   END Init;
  343.  
  344. BEGIN
  345.   In := MyIn;
  346.   Out := MyOut;
  347.  
  348.   XFRB := NIL;
  349.   Init;
  350. END ScsiIO.
  351.